home *** CD-ROM | disk | FTP | other *** search
- """grammar generation stuff for sql.
-
- This module does not bind any rule semantics, it
- just generates the parser data structures.
- """
-
- ### interpretation functions and regexen for terminals
-
- MARSHALFILE = "sql.mar"
-
- import string
- alphanum = string.letters+string.digits + "_"
- userdefre = "[%s][%s]*" % (string.letters +"_", alphanum)
- commentre = "--.*"
-
- def userdeffn(str):
- from string import upper
- return upper(str)
-
- charstre = "'[^']*'"
-
- def charstfn(str):
- return str[1:-1]
-
- #numlitre = "[%s][%s\.]*" % (string.digits, alphanum) # not really...
-
- digits = string.digits
- # rely in python to filter out the good/bad/ugly
- intre = "[%s][%s.jJ]*" % (digits,digits)
- numlitre = "%s\([Ee][+-]?%s\)?" % (intre, intre)
-
- def numlitfn(str):
- """Note: this is "safe" because regex
- filters out dangerous things."""
- return eval(str)
-
- def DeclareTerminals(Grammar):
- Grammar.Addterm("user_defined_name", userdefre, userdeffn)
- Grammar.Addterm("character_string_literal", charstre, charstfn)
- Grammar.Addterm("numeric_literal", numlitre, numlitfn)
-
- def BuildSQL(filename=MARSHALFILE):
- import kjParseBuild
- from sqlgram import sqlrules, nonterms, keywords, puncts
- SQLG = kjParseBuild.NullCGrammar()
- SQLG.SetCaseSensitivity(0)
- DeclareTerminals(SQLG)
- SQLG.Keywords(keywords)
- SQLG.punct(puncts)
- SQLG.Nonterms(nonterms)
- SQLG.comments([commentre])
- # should add comments
- SQLG.Declarerules(sqlrules)
- print "working..."
- SQLG.Compile()
- print "testing"
- from sqlgtest import test
- for x in test:
- print SQLG.DoParse1(x)
- print "dumping to", filename
- outfile = open(filename, "wb")
- SQLG.MarshalDump(outfile)
- outfile.close()
- return SQLG
-
- def reloadSQLG(filename=MARSHALFILE):
- """does not bind any interpretation functions."""
- import kjParser
- infile = open(filename, "rb")
- SQLG = kjParser.UnMarshalGram(infile)
- infile.close()
- DeclareTerminals(SQLG)
- return SQLG
-
- def getSQL():
- from sqlwhere import filename
- return reloadSQLG(filename)
-
-
-
-
-